using System.Text.RegularExpressions;

namespace net.xBei.Helper {
    public static class ShippingHelper {
        public static bool IsValidPhone(string countryCode, string phone, out string msg) {
            if (string.IsNullOrWhiteSpace(countryCode) || string.IsNullOrWhiteSpace(phone)) {
                msg = "国家代码或者电话号码错误";
                return false;
            }
            return countryCode switch {
                "US" => IsValidUsPhone(phone, out msg),
                "JP" => IsValidJpPhone(phone, out msg),
                "CN" => IsValidCnPhone(phone, out msg),
                _ => IsValidPhone(phone, out msg),
            };
        }
        /// <summary>
        /// 手机号码默认校验
        /// </summary>
        /// <param name="phone"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static bool IsValidPhone(string phone, out string msg) {
            msg = "号码错误，只能包含数字和“+”";
            return RegexHelper.IsMatch(phone, "^\\+{0,1}[0-9 ]{4,}$");
        }
        public static bool IsValidUsPhone(string phone, out string msg) {
            msg = "号码错误，10位数字（可以分段）";
            return RegexHelper.IsMatch(phone, "^\\d+$")
                    || RegexHelper.IsMatch(phone, "^\\d{10,11}( ext\\. \\d+){0,1}$")
                    || RegexHelper.IsMatch(phone, "^\\+{0,1}1[ -]\\d{10}( ext\\. \\d+){0,1}$")
                    || RegexHelper.IsMatch(phone, "^(\\+1 ){0,1}\\d{3}-\\d{3}-\\d{4}( ext\\. \\d+){0,1}$", true);
        }
        public static bool IsValidJpPhone(string phone, out string msg) {
            msg = "";
            return true;
        }
        public static bool IsValidCnPhone(string phone, out string msg) {
            msg = "电话号码必须是1开头的11位数";
            if (string.IsNullOrWhiteSpace(phone)) {
                return false;
            }
            return RegexHelper.IsMatch(phone, "^1\\d{10}$");
        }
        public static bool IsValidUsZip(string zip, out string msg) {
            msg = "邮编必须是“5位数字”或者“5位数字-4位数字”，例如：“12345”、“12345-1234”";
            if (string.IsNullOrWhiteSpace(zip)) {
                return false;
            }
            if (RegexHelper.IsMatch(zip, "^\\d{5}$")) {
                return true;
            }
            return RegexHelper.IsMatch(zip, "^\\d{5}-\\d{4}$");
        }
        public static bool IsValidJpZip(string zip, out string msg) {
            msg = "邮编必须是“3位数字-4位数字”，例如：“123-1234”";
            if (string.IsNullOrWhiteSpace(zip)) {
                return false;
            }

            return RegexHelper.IsMatch(zip, "^\\d{3}-\\d{4}$");
        }
        public static bool IsValidCnZip(string zip, out string msg) {
            msg = "邮编必须是“6位数字”例如：“123456";
            if (string.IsNullOrWhiteSpace(zip)) {
                return true;
            }
            return RegexHelper.IsMatch(zip, "^\\d{6}$");
        }
        public static bool IsValidCaZip(string zip, out string msg) {
            msg = "邮编必须为三加三共六个字母及数字混用编号，其中奇数位为A-Z字母，偶数位为0-9数字。例如：“V0T 1H0”";
            if (string.IsNullOrWhiteSpace(zip)) {
                return true;
            }
            return RegexHelper.IsMatch(zip, "^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$");
        }
        public static bool IsValidZip(string zip, Regex test, out string msg, string errmsg) {
            msg = errmsg;
            return test.IsMatch(zip);
        }
        public static bool IsValidZip(string countryCode, string zip, out string msg) {
            msg = "";
            if (string.IsNullOrWhiteSpace(countryCode)) {
                msg = "国家代码或者邮编错误";
                return false;
            }
            switch (countryCode) {
                case "US": return IsValidUsZip(zip, out msg);
                case "JP": return IsValidJpZip(zip, out msg);
                case "CN": return IsValidCnZip(zip, out msg);
                case "CA": return IsValidCaZip(zip, out msg);
                case "GB":
                    return zip == "GIR 0AA" || IsValidZip(
                    zip,
                    new Regex("^([a-z]\\d \\d[a-z]{2})|([a-z]\\d{2} \\d[a-z]{2})|([a-z]{2}\\d \\d[a-z]{2})|([a-z]{2}\\d{2} \\d[a-z]{2})|([a-z]\\d[a-z] \\d[a-z]{2})|([a-z]{2}\\d[a-z] \\d[a-z]{2})$",
                        RegexOptions.Compiled | RegexOptions.IgnoreCase),
                    out msg, "英国邮政编码由6到8字母或者数字组成，例如：“M2 5BQ”、“M34 4AB”、“CR0 2YR”、“DN16 9AA”、“W1A 4ZZ”、“EC1A 1HQ”");
                case "FR": return IsValidZip(zip, new Regex("^\\d{3}(\\d{2}){0,1}$", RegexOptions.Compiled), out msg, "法国邮政编码由3位或5位数字组成，例如：987、28039");
                case "ES": return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "西班牙邮政编码由5位数字组成，例如：28039");
                case "RU": return IsValidZip(zip, new Regex("^\\d{6}$", RegexOptions.Compiled), out msg, "俄罗斯邮政编码由5位数字组成，例如：125075");
                case "DE": return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "德国邮政编码由5位数字组成，例如：26133");
                case "IT": return IsValidZip(zip, new Regex("^(i-|it-){0,1}\\d{5}$", RegexOptions.Compiled), out msg, "意大利邮政编码由5位数字组成，例如：00144");
                case "AU": return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "澳大利亚邮政编码由4位数字组成，例如：2060");
                case "CH": return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "瑞士邮政编码由4位数字组成，例如：2544");
                case "LV": return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "拉脱维亚邮政编码由4位数字组成，例如：1073");
                case "SK": //斯洛伐克共和国
                case "CZ": //捷克共和国
                    return IsValidZip(zip, new Regex("^\\d{3} \\d{2}$", RegexOptions.Compiled), out msg, "邮政编码由3位数字+空格+2位数字，例如：150 00");
                case "AL"://🇦🇱 阿尔巴尼亚	
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "阿尔巴尼亚邮政编码由4位数字组成，例如： 1001");
                case "IE"://🇮🇪 爱尔兰	
                    if (IsValidZip(zip, new Regex("^[A-Z]\\d{2} [A-Z0-9]{4}$", RegexOptions.Compiled), out msg, "邮政编码由数字和字母混合的7位字符组成，例如：T37 F8HK")) {
                        return true;
                    }
                    if (IsValidZip(zip, new Regex("^[A-Z]\\d{2}$", RegexOptions.Compiled), out msg, "邮政编码由数字和字母混合的7位字符组成，例如：T37 F8HK")) {
                        return true;
                    }
                    if (IsValidZip(zip, new Regex("^D6W$", RegexOptions.Compiled), out msg, "邮政编码由数字和字母混合的7位字符组成，例如：T37 F8HK")) {
                        return true;
                    }
                    return IsValidZip(zip, new Regex("^D6W [A-Z0-9]{4}$", RegexOptions.Compiled), out msg, "邮政编码由数字和字母混合的7位字符组成，例如：T37 F8HK");
                case "EE"://🇪🇪 爱沙尼亚
                    return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "爱沙尼亚邮政编码由5位数字组成，例如： 69501");
                case "AD"://🇦🇩 安道尔
                    return true;
                case "AT"://🇦🇹 奥地利
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "奥地利邮政编码由4位数字组成，例如： 1001");
                case "BY"://🇧🇾 白俄罗斯
                    return IsValidZip(zip, new Regex("^\\d{6}$", RegexOptions.Compiled), out msg, "邮政编码由6位数字组成，例如： 220050");
                case "BG"://🇧🇬 保加利亚
                case "BE"://🇧🇪 比利时
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 1001");
                case "IS"://🇮🇸 冰岛
                    return IsValidZip(zip, new Regex("^\\d{3}$", RegexOptions.Compiled), out msg, "邮政编码由3位数字组成，例如： 220");
                case "PL"://🇵🇱 波兰
                    return IsValidZip(zip, new Regex("^\\d{2}-\\d{3}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，前两位和后三位之间有中横线字符，例如： 00-950");
                case "BA"://🇧🇦 波黑
                    return true;
                case "DK"://🇩🇰 丹麦
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 1001");
                case "VA"://🇻🇦 梵蒂冈
                    return true;
                case "FI"://🇫🇮 芬兰
                    return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，例如： 12001");
                case "NL"://🇳🇱 荷兰
                    return IsValidZip(zip, new Regex("^\\d{4} [A-Z]{2}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字加2位字母组成，中间有1个空格，例如： 1234 AB");
                case "HR"://🇭🇷 克罗地亚
                    return true;
                case "LT"://🇱🇹 立陶宛
                    return IsValidZip(zip, new Regex("^LT-\\d{5}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，前面加上“LT-”，例如： LT-04340");
                case "LI"://🇱🇮 列支敦士登
                    return IsValidZip(zip, new Regex("^94\\d{2}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 9485 前2位固定为94");
                case "LU"://🇱🇺 卢森堡
                    return IsValidZip(zip, new Regex("^L-\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，并且由L开头，例如： L-4750");
                case "RO"://🇷🇴 罗马尼亚
                    return IsValidZip(zip, new Regex("^\\d{6}$", RegexOptions.Compiled), out msg, "邮政编码由6位数字组成，例如： 123001");
                case "MT"://🇲🇹 马耳他
                    return IsValidZip(zip, new Regex("^[A-Z]{3} \\d{3} \\d$", RegexOptions.Compiled), out msg, "邮政编码共7位，前3位是字母，后4位是数字，例如： MLH 204 2");
                case "MK"://🇲🇰 马其顿
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 1001");
                case "MD"://🇲🇩 摩尔多瓦
                    return IsValidZip(zip, new Regex("^MD-\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，前面加上国家代码“MD-”，例如： MD-1001");
                case "MC"://🇲🇨 摩纳哥
                    return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，例如： 12001");
                case "NO"://🇳🇴 挪威
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 1001");
                case "PT"://🇵🇹 葡萄牙
                    return IsValidZip(zip, new Regex("^\\d{4}-\\d{3}$", RegexOptions.Compiled), out msg, "邮政编码由7位数字组成，例如： 2725–079");
                case "SE"://🇸🇪 瑞典
                    //瑞典邮政编码由5位数字组成。一条邮编可以分为两部分，前三位数字为一部分，后两位数字为一部分，中间有一个空格隔开。例如： 114 55
                    return true;
                case "SM"://🇸🇲 圣马利诺
                case "SI"://🇸🇮 斯洛文尼亚
                          //斯洛文尼亚邮政编码由4位数字组成，前面加上国家代码“SI-”，例如： 4000 其中第1位数字表示分区，后3位数字表示邮局。
                    return true;
                case "UA"://🇺🇦 乌克兰
                    return IsValidZip(zip, new Regex("^\\d{5}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，例如： 12001");
                case "GR"://🇬🇷 希腊
                    return IsValidZip(zip, new Regex("^\\d{3} \\d{2}$", RegexOptions.Compiled), out msg, "邮政编码由5位数字组成，第三位和第四位数字之间有个空格，例如： 151 24");
                case "HU"://🇭🇺 匈牙利
                    return IsValidZip(zip, new Regex("^\\d{4}$", RegexOptions.Compiled), out msg, "邮政编码由4位数字组成，例如： 1001");
            }
            return true;
        }
    }
}
